package com.yeskery.transfer.config;

import com.yeskery.transfer.core.KeyList;
import com.yeskery.transfer.core.Resource;
import com.yeskery.transfer.data.ConnectionKit;
import com.yeskery.transfer.data.DataKit;
import com.yeskery.transfer.data.DataSourceKit;
import com.yeskery.transfer.data.SproutDataSource;
import org.jline.utils.AttributedString;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.boot.ExitCodeGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.shell.jline.PromptProvider;

/**
 * 系统的配置类
 * @author shuangjiang.du
 * @date 2018-12-12 16:14
 * @version 1.0
 */
@Configuration
public class SystemConfiguration {

	/**
	 * 设置默认的提示符
	 * @return 默认的提示符
	 */
	@Bean
	public PromptProvider promptProvider() {
		return () -> new AttributedString("Sprout:>");
	}

	/**
	 * 数据库配置文件的工具对象
	 * @return 数据库配置文件的工具对象
	 */
	@Bean
	public ConfigPropertiesKit configPropertiesKit() {
		return new ConfigPropertiesKit();
	}

	/**
	 * 数据的工具对象
	 * @return 数据的工具对象
	 */
	@Bean
	public DataKit dataKit() {
		return new DataKit();
	}

	/**
	 * 数据源工具对象
	 * @return 数据源工具对象
	 */
	@Bean
	public DataSourceKit dataSourceKit() {
		return new DataSourceKit();
	}

	/**
	 * 正常退出的结束码
	 * @return 结束码
	 */
	@Bean
	public ExitCodeGenerator exitCodeGenerator() {
		return () -> 200;
	}

	/**
	 * 数据库连接工具对象
	 * @return 数据库连接工具对象
	 */
	@Bean
	public ConnectionKit connectionKit() {
		return new ConnectionKit();
	}

	/**
	 * 退出程序前，关闭所有的连接池
	 * @param resource 系统资源对象
	 * @return 关闭所有的连接池
	 */
	@Bean
	public DisposableBean datasourceDisposableBean(Resource resource) {
		return () -> {
			SproutDataSource serverDataSource = resource.get(KeyList.SERVER_DATA_SOURCE, SproutDataSource.class);
			SproutDataSource clientDataSource = resource.get(KeyList.CLIENT_DATA_SOURCE, SproutDataSource.class);
			if (serverDataSource != null) {
				serverDataSource.closeAllConnections();
			}
			if (clientDataSource != null) {
				clientDataSource.closeAllConnections();
			}
		};
	}
}
